package model;

/**
 *
 * @author João Gonçalves
 * @author Eventon Silva
 */
public class Processo implements Comparable<Processo> {

    //Atributos do processo
    private int dataCriacao;
    private int duracao;
    private int duracaoRestante;
    private int prioridade;
    private int status;
    private int termino;

    /**
     * Cria um novo processo.
     *
     * @param dataCriacao Data da criação do processo no sistema.
     * @param duracao Duração do processo (em segundos).
     * @param prioridade Prioridade do processo.
     */
    public Processo(int dataCriacao, int duracao, int prioridade) {
        this.dataCriacao = dataCriacao;
        this.duracao = duracao;
        this.prioridade = prioridade;
        this.duracaoRestante = duracao;
    }

    public int getDataCriacao() {
        return dataCriacao;
    }

    public void setDataCriacao(int dataCriacao) {
        this.dataCriacao = dataCriacao;
    }

    public int getDuracao() {
        return duracao;
    }

    public void setDuracao(int duracao) {
        this.duracao = duracao;
    }

    public int getPrioridade() {
        return prioridade;
    }

    public void setPrioridade(int prioridade) {
        this.prioridade = prioridade;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    /**
     * Método responsável pelo retorno do tempo restante para o término
     * do processo.
     * 
     * @return Tempo restante para o fim da execução do processo.
     */
    public int getDuracaoRestante() {
        return duracaoRestante;
    }

    public void setDuracaoRestante(int duracaoRestante) {
        this.duracaoRestante = duracaoRestante;
    }

    public int getTermino() {
        return termino;
    }

    public void setTermino(int termino) {
        this.termino = termino;
    }

    /*
     * Contabiliza o tempo restante que falta para
     * o processo ser finalizado.
     */
    public void tempo() {
        this.duracaoRestante = this.duracaoRestante - 1;
    }

    /*
     * Sobreescrevemos o método para a comparação de objetos.
     * Neste caso, servirá para comparar os processos e assim
     * pode organizar-los de forma crescente (ou descrecente) 
     * levando em consideração o atributo dataCriacao.
     * 
     * E será utilizado para permitir o uso do Colletions.sort
     * sobre um array de processos, assim ordenando as entradas.  
     * 
     * @see java.lang.Comparable#compareTo(java.lang.Object)
     */
    @Override
    public int compareTo(Processo p) {
        if (this.dataCriacao < p.dataCriacao) {
            return -1;
        } else if (this.dataCriacao > p.dataCriacao) {
            return 1;
        } else {
            return 0;
        }
    }

    @Override
    public String toString() {
        return getDataCriacao() + " " + getDuracao() + " " + getPrioridade();
    }
}